package cc.magicjson.example.demo.thead.scheduler;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class CustomThreadPoolWithRejectionHandler {

    public static void main(String[] args) {
        // 创建一个AtomicInteger来记录提交的任务数
        AtomicInteger taskCounter = new AtomicInteger(0);
        // 自定义拒绝策略
        RejectedExecutionHandler rejectionHandler = (r, executor) -> {
            int rejectedTaskNumber = Double.valueOf(taskCounter.doubleValue()).intValue();
            System.out.println("任务 " + rejectedTaskNumber + " 被拒绝");
            throw new RejectedExecutionException();
        };

        // 创建一个具有核心5个线程，最大10个线程，任务队列大小为2，自定义拒绝策略的线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            5,                  // 核心线程数
            10,                 // 最大线程数
            60,                 // 空闲线程存活时间
            TimeUnit.SECONDS,   // 时间单位
            new ArrayBlockingQueue<>(2),  // 任务队列大小
            rejectionHandler   // 自定义拒绝策略
        );

        // CountDownLatch，确保所有任务在同一时间点开始执行
        CountDownLatch startLatch = new CountDownLatch(1);
        CountDownLatch endLatch = new CountDownLatch(20);
        // 提交20个任务
        for (int i = 1; i <= 20; i++) {
            final int taskId = i;
            executor.submit(() -> {
                try {
                    taskCounter.incrementAndGet(); // 记录提交的任务数
                    startLatch.await();  // 等待启动信号
                    System.out.println("任务 " + taskId + " 开始执行");
//                    Thread.sleep((long) (Math.random() * 1000)); // 模拟任务执行时间
                    System.out.println("任务 " + taskId + " 执行完毕");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    System.out.println("任务 " + taskId + " 被中断");
                } finally {
                    endLatch.countDown();  // 任务完成，计数器减1
                }
            });
        }

        System.out.println("所有任务准备就绪，开始执行...");
        startLatch.countDown();  // 启动所有任务

        try {
            endLatch.await();  // 等待所有任务完成
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        executor.shutdown();
        System.out.println("所有任务执行完毕");
    }
}
